# Functions and information taken from these two sources.
## https://scrnaseq-course.cog.sanger.ac.uk/website/biological-analysis.html#pseudotime-analysis
# https://stemangiola.github.io/tidyseurat/
#Load in .rds object containing filtered and clustered data.
kerato <- readRDS(file = "pseudoSLkera.rds")
#load all libraries.
library(dplyr)
Attaching package: ‘dplyr’
The following objects are masked from ‘package:GenomicRanges’:
intersect, setdiff, union
The following object is masked from ‘package:GenomeInfoDb’:
intersect
The following objects are masked from ‘package:IRanges’:
collapse, desc, intersect, setdiff, slice, union
The following objects are masked from ‘package:S4Vectors’:
first, intersect, rename, setdiff, setequal, union
The following object is masked from ‘package:matrixStats’:
count
The following object is masked from ‘package:Biobase’:
combine
The following objects are masked from ‘package:BiocGenerics’:
combine, intersect, setdiff, union
The following objects are masked from ‘package:stats’:
filter, lag
The following objects are masked from ‘package:base’:
intersect, setdiff, setequal, union
library(Seurat)
Attaching SeuratObject
Attaching package: ‘Seurat’
The following object is masked from ‘package:SummarizedExperiment’:
Assays
library(patchwork)
library(data.table)
data.table 1.14.0 using 1 threads (see ?getDTthreads). Latest news: r-datatable.com
**********
This installation of data.table has not detected OpenMP support. It should still work but in single-threaded mode.
This is a Mac. Please read https://mac.r-project.org/openmp/. Please engage with Apple and ask them for support. Check r-datatable.com for updates, and our Mac instructions here: https://github.com/Rdatatable/data.table/wiki/Installation. After several years of many reports of installation problems on Mac, it's time to gingerly point out that there have been no similar problems on Windows or Linux.
**********
Attaching package: ‘data.table’
The following objects are masked from ‘package:dplyr’:
between, first, last
The following object is masked from ‘package:SummarizedExperiment’:
shift
The following object is masked from ‘package:GenomicRanges’:
shift
The following object is masked from ‘package:IRanges’:
shift
The following objects are masked from ‘package:S4Vectors’:
first, second
library(stringr)
library(ggplot2)
non-uniform 'Rounding' sampler used
library(Signac)
library(SeuratWrappers)
library(monocle3)
library(Matrix)
Attaching package: ‘Matrix’
The following object is masked from ‘package:S4Vectors’:
expand
library(tidyseurat)
========================================
tidyseurat version 0.2.7
To restore the Seurat default display use options("restore_Seurat_show" = TRUE)
========================================
Attaching package: ‘tidyseurat’
The following objects are masked from ‘package:dplyr’:
add_count, bind_cols, bind_rows, count
The following object is masked from ‘package:IRanges’:
slice
The following object is masked from ‘package:S4Vectors’:
rename
The following object is masked from ‘package:matrixStats’:
count
The following object is masked from ‘package:stats’:
filter
library(DEGreport)
set.seed(1234)
#working directory, change if using on system other than authors to folder with.rds file in.
setwd("~/OneDrive - Queen Mary, University of London/QMUL/Lab/Coding/data/R/Seurat/SandLKerato")
# this section builds lists containing gene IDs. These IDs are sorted into lists related to their function and/or their research area associated with them.
# kerato_marker_genes contain general keratinocyte differentiation markers.
kerato_marker_genes <- c("Krt10", "Krt5", "Krt14", "Sprr1a", "Sprr1b", "Evpl", "Dsp", "Ppl", "Klk11", "Spink5", "Klf4", "Klk6", "Klk7", "Klk8", "Klk10")
# cell_state_markers contains genes used to mark the cell cycle state of cells, in this case currently proliferative markers.
cell_state_markers <- c("Mki67","Pcna")
# actin_markers contains all genes associated with the actin cytoskeleton.
actin_markers <- c("Arhgdia","Camsap2", "Anxa1", "Rflnb", "Tmsb4x", "Arpc1b", "Sbsn","Dsg3", "Ahnak", "Cdh1", "Col3a1", "Tpt1", "Lgals7", "Rack1", "S100a11", "Eef1b2", "Ran", "Sprr1a", "Klf8", "Ptprf")
# plmn_markers has putative lamin bodies markers investigated.
plmn_markers <- c("Ipo7", "Ran", "Snupn", "Matr3", "Nup153")
# SGPB_markers contains genes associated with condensates, primarly stress granules and P bodies.
SGPB_markers <- c("Ddx6", "Eif4e", "Nxf1", "Lsm14a", "Caprin1", "Csde1", "Pum1", "Zfp36")
# other_markers contains miscellaneous markers, notes below variable show reasoning.
other_markers <- c("Snhg11", "Fabp5", "Slc25a4", "Lgals7", "Tacstd2", "Fosb", "Cd44", "Trpv4", "Trpm4" )
#Tr genes are calcium channels found specifically in UGL Matsui 2021
#kerato market genes not found
#("Klk5"))("Klk2"))("Klk3"))("Klk4"))("Klk9"))
# ("Crnn")) Cornulin ("Sprr2a")) not found ("Sprr2b")) ("Sprr2c"))
# ("Sprr2d")) ("Sprr2e")) ("Sprr2f")) ("Sprr2g")) ("Sprr3")) ("Sprr4"))
# ("AABR07012329.1")) ("Lor")) ("Flg")) ("Rgpd1")) ("Syne4")) Dcp2,
#dsg1, dsp - spinous,
# spink5, granular
#Dsp, Ppl, Evpl
#combines all above lists into one superlist 'list_of_features', which is then parsed to later image functions.
list_of_features <- c(kerato_marker_genes, cell_state_markers, actin_markers, plmn_markers, SGPB_markers, other_markers)
# will make variable 'tidykerato', a form of object that can be easily parsed to data analysis, similar to tibble.
# tidykerato <- tidyseurat::kerato
# using pipes to push kerato QC data into boxplots. The three major QC covariates are plotted against frequency over the clusters.
# Number of counts of RNA per barcode.
kerato %>%
tidyseurat::ggplot(aes(seurat_clusters, nCount_RNA, fill = seurat_clusters)) + # using ggplot2 aesthetics to change labels and add jitter.
geom_boxplot(outlier.shape = NA) +
geom_jitter(width = 0.1) +
xlab('Cluster') +
ylab('RNA Read Count') +
labs(fill = "Cluster") + theme(legend.position="none")

# Number of features per barcode.
kerato %>%
tidyseurat::ggplot(aes(seurat_clusters, nFeature_RNA, fill = seurat_clusters)) +
geom_boxplot(outlier.shape = NA) + # using ggplot2 aesthetics to change labels and add jitter.
geom_jitter(width = 0.1) +
xlab('Cluster') +
ylab('RNA Feature Count') +
labs(fill = "Cluster") + theme(legend.position="none")

# Percentage mitochondrial RNA content per barcode.
kerato %>%
tidyseurat::ggplot(aes(seurat_clusters, percent.mt, fill = seurat_clusters)) +
geom_boxplot(outlier.shape = NA) + # using ggplot2 aesthetics to change labels and add jitter.
geom_jitter(width = 0.1) +
xlab('Cluster') +
ylab('Percentage mitochondrial RNA') +
labs(fill = "Cluster") + theme(legend.position="none")

NA
NA
VlnPlot(kerato, features = c("percent.mt")) + scale_x_discrete(name ="Cluster", limits=c("2","3","1", "0"), labels=c("Small", "Mid-stage","Late-stage", "Dead")) + ggtitle("Percentage mitochondrial RNA") + theme(axis.title.x = element_blank())

VlnPlot(kerato, features = c("nFeature_RNA")) + scale_x_discrete(name ="Cluster", limits=c("2","3","1", "0"), labels=c("Small", "Mid-stage","Late-stage", "Dead")) + ggtitle("Number of features") + theme(axis.title.x = element_blank())

VlnPlot(kerato, features = c("nCount_RNA")) + scale_x_discrete(name ="Cluster", limits=c("2","3","1", "0"), labels=c("Small", "Mid-stage","Late-stage", "Dead")) + ggtitle("Number of counts") + theme(axis.title.x = element_blank())

# Chunk printing QC metrics to console, allows extraction and analysis of statistics.
cat('counts')
counts
summary(kerato$nCount_RNA)
Min. 1st Qu. Median Mean 3rd Qu. Max.
245 608 4710 10898 14239 83967
cat('mito')
mito
summary(kerato$percent.mt)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.0000 0.7492 5.5753 13.9546 26.2964 49.1361
cat('features')
features
summary(kerato$nFeature_RNA)
Min. 1st Qu. Median Mean 3rd Qu. Max.
201.0 372.5 1286.0 1765.8 2797.0 5936.0
# Parse list_of_features to FeaturePlot, which gives heatmaps of the clusters showing a features expression.
for (gene in list_of_features){
p <- FeaturePlot(kerato, features = (gene))
print(p)
}



























































# Use this line to see single feature plot, for ease.
FeaturePlot(kerato, features = "Sbsn")

for (gene in actin_markers){
p <- FeaturePlot(kerato, features = (gene))
print(p)
}




















# Parse QC metrics to FeaturePlot, which gives heatmaps of the clusters showing a features expression.
FeaturePlot(kerato, features = "percent.mt", label = TRUE)

FeaturePlot(kerato, features = "percent.mt")

FeaturePlot(kerato, features = "nFeature_RNA", label = TRUE)

FeaturePlot(kerato, features = "nFeature_RNA")

FeaturePlot(kerato, features = "nCount_RNA", label = TRUE)

FeaturePlot(kerato, features = "nCount_RNA")

DimPlot(kerato, reduction = "umap", label = TRUE, pt.size = 0.5)

# Create list of marker genes for the clusters using filters. min.pct is the minimum percentage present. only.pos selects only positive markers for this.
markers_streamlined <-
kerato %>%
FindAllMarkers(only.pos = TRUE, min.pct = 0.25, thresh.use = 0.25) %>%
group_by(cluster) %>%
top_n(10, avg_log2FC) # only take top ten genes.
Calculating cluster 0
| | 0 % ~calculating
|+ | 1 % ~01s
|++ | 2 % ~01s
|++ | 3 % ~01s
|+++ | 4 % ~01s
|+++ | 5 % ~01s
|++++ | 6 % ~01s
|++++ | 7 % ~01s
|+++++ | 9 % ~01s
|+++++ | 10% ~01s
|++++++ | 11% ~01s
|++++++ | 12% ~01s
|+++++++ | 13% ~01s
|+++++++ | 14% ~01s
|++++++++ | 15% ~01s
|++++++++ | 16% ~01s
|+++++++++ | 17% ~01s
|++++++++++ | 18% ~01s
|++++++++++ | 19% ~01s
|+++++++++++ | 20% ~01s
|+++++++++++ | 21% ~01s
|++++++++++++ | 22% ~01s
|++++++++++++ | 23% ~01s
|+++++++++++++ | 24% ~01s
|+++++++++++++ | 26% ~01s
|++++++++++++++ | 27% ~01s
|++++++++++++++ | 28% ~01s
|+++++++++++++++ | 29% ~01s
|+++++++++++++++ | 30% ~01s
|++++++++++++++++ | 31% ~01s
|++++++++++++++++ | 32% ~01s
|+++++++++++++++++ | 33% ~01s
|++++++++++++++++++ | 34% ~01s
|++++++++++++++++++ | 35% ~01s
|+++++++++++++++++++ | 36% ~01s
|+++++++++++++++++++ | 37% ~01s
|++++++++++++++++++++ | 38% ~01s
|++++++++++++++++++++ | 39% ~01s
|+++++++++++++++++++++ | 40% ~01s
|+++++++++++++++++++++ | 41% ~01s
|++++++++++++++++++++++ | 43% ~01s
|++++++++++++++++++++++ | 44% ~01s
|+++++++++++++++++++++++ | 45% ~01s
|+++++++++++++++++++++++ | 46% ~01s
|++++++++++++++++++++++++ | 47% ~01s
|++++++++++++++++++++++++ | 48% ~01s
|+++++++++++++++++++++++++ | 49% ~01s
|+++++++++++++++++++++++++ | 50% ~01s
|++++++++++++++++++++++++++ | 51% ~01s
|+++++++++++++++++++++++++++ | 52% ~01s
|+++++++++++++++++++++++++++ | 53% ~01s
|++++++++++++++++++++++++++++ | 54% ~01s
|++++++++++++++++++++++++++++ | 55% ~01s
|+++++++++++++++++++++++++++++ | 56% ~01s
|+++++++++++++++++++++++++++++ | 57% ~01s
|++++++++++++++++++++++++++++++ | 59% ~01s
|++++++++++++++++++++++++++++++ | 60% ~01s
|+++++++++++++++++++++++++++++++ | 61% ~01s
|+++++++++++++++++++++++++++++++ | 62% ~01s
|++++++++++++++++++++++++++++++++ | 63% ~01s
|++++++++++++++++++++++++++++++++ | 64% ~01s
|+++++++++++++++++++++++++++++++++ | 65% ~00s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|+++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|++++++++++++++++++++++++++++++++++++ | 70% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|+++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|++++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s
Calculating cluster 1
| | 0 % ~calculating
|+ | 1 % ~01s
|++ | 2 % ~01s
|++ | 3 % ~01s
|+++ | 4 % ~01s
|+++ | 5 % ~01s
|++++ | 6 % ~01s
|++++ | 7 % ~01s
|+++++ | 8 % ~01s
|+++++ | 9 % ~01s
|++++++ | 10% ~01s
|++++++ | 11% ~01s
|+++++++ | 12% ~01s
|+++++++ | 14% ~01s
|++++++++ | 15% ~01s
|++++++++ | 16% ~01s
|+++++++++ | 17% ~01s
|+++++++++ | 18% ~01s
|++++++++++ | 19% ~01s
|++++++++++ | 20% ~01s
|+++++++++++ | 21% ~01s
|+++++++++++ | 22% ~01s
|++++++++++++ | 23% ~01s
|++++++++++++ | 24% ~01s
|+++++++++++++ | 25% ~01s
|++++++++++++++ | 26% ~01s
|++++++++++++++ | 27% ~01s
|+++++++++++++++ | 28% ~01s
|+++++++++++++++ | 29% ~01s
|++++++++++++++++ | 30% ~01s
|++++++++++++++++ | 31% ~01s
|+++++++++++++++++ | 32% ~01s
|+++++++++++++++++ | 33% ~01s
|++++++++++++++++++ | 34% ~01s
|++++++++++++++++++ | 35% ~01s
|+++++++++++++++++++ | 36% ~01s
|+++++++++++++++++++ | 38% ~01s
|++++++++++++++++++++ | 39% ~01s
|++++++++++++++++++++ | 40% ~01s
|+++++++++++++++++++++ | 41% ~01s
|+++++++++++++++++++++ | 42% ~01s
|++++++++++++++++++++++ | 43% ~01s
|++++++++++++++++++++++ | 44% ~01s
|+++++++++++++++++++++++ | 45% ~01s
|+++++++++++++++++++++++ | 46% ~01s
|++++++++++++++++++++++++ | 47% ~01s
|++++++++++++++++++++++++ | 48% ~01s
|+++++++++++++++++++++++++ | 49% ~01s
|+++++++++++++++++++++++++ | 50% ~01s
|++++++++++++++++++++++++++ | 51% ~01s
|+++++++++++++++++++++++++++ | 52% ~01s
|+++++++++++++++++++++++++++ | 53% ~01s
|++++++++++++++++++++++++++++ | 54% ~01s
|++++++++++++++++++++++++++++ | 55% ~01s
|+++++++++++++++++++++++++++++ | 56% ~01s
|+++++++++++++++++++++++++++++ | 57% ~01s
|++++++++++++++++++++++++++++++ | 58% ~01s
|++++++++++++++++++++++++++++++ | 59% ~01s
|+++++++++++++++++++++++++++++++ | 60% ~01s
|+++++++++++++++++++++++++++++++ | 61% ~00s
|++++++++++++++++++++++++++++++++ | 62% ~00s
|++++++++++++++++++++++++++++++++ | 64% ~00s
|+++++++++++++++++++++++++++++++++ | 65% ~00s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|+++++++++++++++++++++++++++++++++++ | 70% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|+++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s
Calculating cluster 2
| | 0 % ~calculating
|+ | 1 % ~01s
|+ | 2 % ~01s
|++ | 3 % ~01s
|++ | 4 % ~01s
|+++ | 5 % ~01s
|+++ | 6 % ~01s
|++++ | 7 % ~01s
|++++ | 8 % ~01s
|+++++ | 9 % ~01s
|+++++ | 10% ~01s
|++++++ | 11% ~01s
|++++++ | 12% ~01s
|+++++++ | 13% ~01s
|+++++++ | 14% ~01s
|++++++++ | 15% ~01s
|++++++++ | 16% ~01s
|+++++++++ | 17% ~01s
|+++++++++ | 18% ~01s
|++++++++++ | 19% ~01s
|++++++++++ | 20% ~01s
|+++++++++++ | 21% ~01s
|+++++++++++ | 22% ~01s
|++++++++++++ | 23% ~01s
|++++++++++++ | 24% ~01s
|+++++++++++++ | 25% ~01s
|+++++++++++++ | 26% ~01s
|++++++++++++++ | 27% ~01s
|++++++++++++++ | 28% ~01s
|+++++++++++++++ | 29% ~01s
|+++++++++++++++ | 30% ~01s
|++++++++++++++++ | 31% ~01s
|++++++++++++++++ | 32% ~01s
|+++++++++++++++++ | 33% ~01s
|+++++++++++++++++ | 34% ~01s
|++++++++++++++++++ | 35% ~01s
|++++++++++++++++++ | 36% ~01s
|+++++++++++++++++++ | 37% ~01s
|+++++++++++++++++++ | 38% ~01s
|++++++++++++++++++++ | 39% ~01s
|++++++++++++++++++++ | 40% ~01s
|+++++++++++++++++++++ | 41% ~01s
|+++++++++++++++++++++ | 42% ~01s
|++++++++++++++++++++++ | 43% ~01s
|++++++++++++++++++++++ | 44% ~01s
|+++++++++++++++++++++++ | 45% ~01s
|+++++++++++++++++++++++ | 46% ~01s
|++++++++++++++++++++++++ | 47% ~01s
|++++++++++++++++++++++++ | 48% ~01s
|+++++++++++++++++++++++++ | 49% ~01s
|+++++++++++++++++++++++++ | 50% ~01s
|++++++++++++++++++++++++++ | 51% ~01s
|++++++++++++++++++++++++++ | 52% ~01s
|+++++++++++++++++++++++++++ | 53% ~01s
|+++++++++++++++++++++++++++ | 54% ~01s
|++++++++++++++++++++++++++++ | 55% ~01s
|++++++++++++++++++++++++++++ | 56% ~01s
|+++++++++++++++++++++++++++++ | 57% ~01s
|+++++++++++++++++++++++++++++ | 58% ~01s
|++++++++++++++++++++++++++++++ | 59% ~01s
|++++++++++++++++++++++++++++++ | 60% ~00s
|+++++++++++++++++++++++++++++++ | 61% ~00s
|+++++++++++++++++++++++++++++++ | 62% ~00s
|++++++++++++++++++++++++++++++++ | 63% ~00s
|++++++++++++++++++++++++++++++++ | 64% ~00s
|+++++++++++++++++++++++++++++++++ | 65% ~00s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|+++++++++++++++++++++++++++++++++++ | 70% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|+++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 79% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 93% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01s
Calculating cluster 3
| | 0 % ~calculating
|+ | 1 % ~01s
|++ | 2 % ~01s
|++ | 3 % ~01s
|+++ | 4 % ~01s
|+++ | 5 % ~01s
|++++ | 6 % ~01s
|++++ | 8 % ~01s
|+++++ | 9 % ~01s
|+++++ | 10% ~01s
|++++++ | 11% ~01s
|++++++ | 12% ~01s
|+++++++ | 13% ~01s
|+++++++ | 14% ~01s
|++++++++ | 15% ~01s
|+++++++++ | 16% ~01s
|+++++++++ | 17% ~01s
|++++++++++ | 18% ~01s
|++++++++++ | 19% ~01s
|+++++++++++ | 20% ~01s
|+++++++++++ | 22% ~01s
|++++++++++++ | 23% ~01s
|++++++++++++ | 24% ~01s
|+++++++++++++ | 25% ~01s
|+++++++++++++ | 26% ~01s
|++++++++++++++ | 27% ~01s
|++++++++++++++ | 28% ~01s
|+++++++++++++++ | 29% ~01s
|++++++++++++++++ | 30% ~01s
|++++++++++++++++ | 31% ~01s
|+++++++++++++++++ | 32% ~01s
|+++++++++++++++++ | 33% ~01s
|++++++++++++++++++ | 34% ~01s
|++++++++++++++++++ | 35% ~01s
|+++++++++++++++++++ | 37% ~01s
|+++++++++++++++++++ | 38% ~01s
|++++++++++++++++++++ | 39% ~01s
|++++++++++++++++++++ | 40% ~01s
|+++++++++++++++++++++ | 41% ~01s
|+++++++++++++++++++++ | 42% ~01s
|++++++++++++++++++++++ | 43% ~01s
|+++++++++++++++++++++++ | 44% ~01s
|+++++++++++++++++++++++ | 45% ~01s
|++++++++++++++++++++++++ | 46% ~01s
|++++++++++++++++++++++++ | 47% ~01s
|+++++++++++++++++++++++++ | 48% ~01s
|+++++++++++++++++++++++++ | 49% ~01s
|++++++++++++++++++++++++++ | 51% ~01s
|++++++++++++++++++++++++++ | 52% ~01s
|+++++++++++++++++++++++++++ | 53% ~01s
|+++++++++++++++++++++++++++ | 54% ~01s
|++++++++++++++++++++++++++++ | 55% ~01s
|++++++++++++++++++++++++++++ | 56% ~01s
|+++++++++++++++++++++++++++++ | 57% ~01s
|++++++++++++++++++++++++++++++ | 58% ~01s
|++++++++++++++++++++++++++++++ | 59% ~01s
|+++++++++++++++++++++++++++++++ | 60% ~01s
|+++++++++++++++++++++++++++++++ | 61% ~01s
|++++++++++++++++++++++++++++++++ | 62% ~01s
|++++++++++++++++++++++++++++++++ | 63% ~01s
|+++++++++++++++++++++++++++++++++ | 65% ~01s
|+++++++++++++++++++++++++++++++++ | 66% ~00s
|++++++++++++++++++++++++++++++++++ | 67% ~00s
|++++++++++++++++++++++++++++++++++ | 68% ~00s
|+++++++++++++++++++++++++++++++++++ | 69% ~00s
|+++++++++++++++++++++++++++++++++++ | 70% ~00s
|++++++++++++++++++++++++++++++++++++ | 71% ~00s
|+++++++++++++++++++++++++++++++++++++ | 72% ~00s
|+++++++++++++++++++++++++++++++++++++ | 73% ~00s
|++++++++++++++++++++++++++++++++++++++ | 74% ~00s
|++++++++++++++++++++++++++++++++++++++ | 75% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 76% ~00s
|+++++++++++++++++++++++++++++++++++++++ | 77% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 78% ~00s
|++++++++++++++++++++++++++++++++++++++++ | 80% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 81% ~00s
|+++++++++++++++++++++++++++++++++++++++++ | 82% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 83% ~00s
|++++++++++++++++++++++++++++++++++++++++++ | 84% ~00s
|+++++++++++++++++++++++++++++++++++++++++++ | 85% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 86% ~00s
|++++++++++++++++++++++++++++++++++++++++++++ | 87% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 88% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++ | 89% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 90% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++ | 91% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 92% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++ | 94% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 95% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++ | 96% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s
|+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s
|++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=02s
# Plot heatmap
kerato %>%
DoHeatmap(
features = markers_streamlined$gene
)

# changing text size with + theme(axis.text.y = element_text(size = 0.1)) doesn't seem to work, needs some graphical adjustments.
# Parse QC metrics to scatter plots using geom_point (ggplot2), adding smoothened line of best fit with stat_smooth, and pearson correlation coefficient with geom_cor.
kerato %>%
tidyseurat::ggplot(aes(x=Pseudotime, y=nCount_RNA)) +
geom_point() +
stat_smooth(method="lm", se=TRUE, colour = 'black', plot.cor = TRUE) +
geom_cor(method = "pearson")
Ignoring unknown parameters: plot.cor

kerato %>%
tidyseurat::ggplot(aes(x=Pseudotime, y=percent.mt)) + geom_point() +
stat_smooth(method="lm", se=TRUE, colour = 'black', plot.cor = TRUE) +
geom_cor(method = "pearson")
Ignoring unknown parameters: plot.cor

kerato %>%
tidyseurat::ggplot(aes(x=Pseudotime, y=nFeature_RNA)) +
geom_point() +
stat_smooth(method="lm", se=TRUE, colour = 'black', plot.cor = TRUE) +
geom_cor(method = "pearson")
Ignoring unknown parameters: plot.cor

# This chunk parses all feature genes to FeatureScatter, and adds a line of best fit with standard error region present.
for (gene in list_of_features){
#zero_scrub <- subset(x = kerato, subset = (as.factor('Krt10') > 0))
# solution may be here: https://github.com/satijalab/seurat/issues/2619
p <- FeatureScatter(kerato, feature1 = "Pseudotime", feature2 = (gene))
print(p +
theme(plot.title = element_text(hjust = 1.2, vjust = -2)) + # adjust pearsons coefficient to right hand side
stat_smooth(method="lm", se=TRUE, colour = 'black') + # regression line
#labels
xlab('Pseudotime') +
ylab(sprintf('%s Log2 Expression', gene)) +
labs(fill = "Cluster"))
}



























































#zero_scrub <- subset(x = kerato, subset = (as.factor('Krt10') > 0))
# solution may be here: https://github.com/satijalab/seurat/issues/2619
# obj_subset <- kerato[, GetAssayData(kerato[[assay]])[gene, ] > 1]
#actin_markers <- c("Arhgdia","Camsap2", "Anxa1", "Rflnb", "Tmsb4x", "Arpc1b", "Sbsn","Dsg3", "Ahnak", "Cdh1", "Col3a1", "Tpt1", "Lgals7", "Rack1", "S100a11", "Eef1b2", "Ran", "Sprr1a", "Klf8", "Ptprf") Cfl1, Ipo9, Xpo6, Tgm1
# set gene for line plot|
# |
# |
obj_subset <- subset(x = kerato, subset = Xpo6 > 0)
p <- FeatureScatter(obj_subset, feature1 = "Pseudotime", feature2 = (gene))
print(p +
theme(plot.title = element_text(hjust = 1.2, vjust = -2)) + # adjust pearsons coefficient to right hand side
stat_smooth(method="lm", se=TRUE, colour = 'black') + # regression line
#labels
xlab('Pseudotime') +
ylab(sprintf('%s Log2 Expression', gene)) +
labs(fill = "Cluster"))

for (gene in actin_markers){
p <- FeatureScatter(kerato, feature1 = "Pseudotime", feature2 = (gene))
print(p +
theme(plot.title = element_text(hjust = 1.2, vjust = -2)) + # adjust pearsons coefficient to right hand side
stat_smooth(method="lm", se=TRUE, colour = 'black') + # regression line
#labels
xlab('Pseudotime') +
ylab(sprintf('%s Log2 Expression', gene)) +
labs(fill = "Cluster"))
}




















# Similar to chunk above, investigating single genes for ease of use.
pseudotime_scatter_gene <- 'Ctsa'
#"Ddx6", "Eif4e"
#b, l, d, s, h, c, k, e, g, z, j, f, r, m, 7, a, q
FeatureScatter(kerato, feature1 = "Pseudotime", feature2 = (pseudotime_scatter_gene)) +
theme(plot.title = element_text(hjust = 1.2, vjust = -2)) + # adjust pearsons coefficient to right hand side
stat_smooth(method="lm", se=TRUE, colour = 'black') + # regression line
#labels
xlab('Pseudotime') +
ylab(sprintf('%s Log2 Expression', pseudotime_scatter_gene)) +
labs(fill = "Cluster")
FeaturePlot(kerato, features = (pseudotime_scatter_gene))
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OgogIHdvcmRfZG9jdW1lbnQ6IGRlZmF1bHQKICBodG1sX25vdGVib29rOiBkZWZhdWx0Ci0tLQoKYGBge3J9CiMgRnVuY3Rpb25zIGFuZCBpbmZvcm1hdGlvbiB0YWtlbiBmcm9tIHRoZXNlIHR3byBzb3VyY2VzLiAKIyMgaHR0cHM6Ly9zY3JuYXNlcS1jb3Vyc2UuY29nLnNhbmdlci5hYy51ay93ZWJzaXRlL2Jpb2xvZ2ljYWwtYW5hbHlzaXMuaHRtbCNwc2V1ZG90aW1lLWFuYWx5c2lzCiMgaHR0cHM6Ly9zdGVtYW5naW9sYS5naXRodWIuaW8vdGlkeXNldXJhdC8KCgojTG9hZCBpbiAucmRzIG9iamVjdCBjb250YWluaW5nIGZpbHRlcmVkIGFuZCBjbHVzdGVyZWQgZGF0YS4Ka2VyYXRvIDwtIHJlYWRSRFMoZmlsZSA9ICJwc2V1ZG9TTGtlcmEucmRzIikKCiNsb2FkIGFsbCBsaWJyYXJpZXMuIApsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShwYXRjaHdvcmspCmxpYnJhcnkoZGF0YS50YWJsZSkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoU2lnbmFjKQpsaWJyYXJ5KFNldXJhdFdyYXBwZXJzKQpsaWJyYXJ5KG1vbm9jbGUzKQpsaWJyYXJ5KE1hdHJpeCkKbGlicmFyeSh0aWR5c2V1cmF0KQpsaWJyYXJ5KERFR3JlcG9ydCkKc2V0LnNlZWQoMTIzNCkKCiN3b3JraW5nIGRpcmVjdG9yeSwgY2hhbmdlIGlmIHVzaW5nIG9uIHN5c3RlbSBvdGhlciB0aGFuIGF1dGhvcnMgdG8gZm9sZGVyIHdpdGgucmRzIGZpbGUgaW4uIApzZXR3ZCgifi9PbmVEcml2ZSAtIFF1ZWVuIE1hcnksIFVuaXZlcnNpdHkgb2YgTG9uZG9uL1FNVUwvTGFiL0NvZGluZy9kYXRhL1IvU2V1cmF0L1NhbmRMS2VyYXRvIikKCmBgYAoKCmBgYHtyfQojIHRoaXMgc2VjdGlvbiBidWlsZHMgbGlzdHMgY29udGFpbmluZyBnZW5lIElEcy4gVGhlc2UgSURzIGFyZSBzb3J0ZWQgaW50byBsaXN0cyByZWxhdGVkIHRvIHRoZWlyIGZ1bmN0aW9uIGFuZC9vciB0aGVpciByZXNlYXJjaCBhcmVhIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiAKCiMga2VyYXRvX21hcmtlcl9nZW5lcyBjb250YWluIGdlbmVyYWwga2VyYXRpbm9jeXRlIGRpZmZlcmVudGlhdGlvbiBtYXJrZXJzLgprZXJhdG9fbWFya2VyX2dlbmVzIDwtIGMoIktydDEwIiwgIktydDUiLCAiS3J0MTQiLCAiU3BycjFhIiwgIlNwcnIxYiIsICJFdnBsIiwgIkRzcCIsICJQcGwiLCAiS2xrMTEiLCAiU3Bpbms1IiwgIktsZjQiLCAiS2xrNiIsICJLbGs3IiwgIktsazgiLCAiS2xrMTAiKQoKIyBjZWxsX3N0YXRlX21hcmtlcnMgY29udGFpbnMgZ2VuZXMgdXNlZCB0byBtYXJrIHRoZSBjZWxsIGN5Y2xlIHN0YXRlIG9mIGNlbGxzLCBpbiB0aGlzIGNhc2UgY3VycmVudGx5IHByb2xpZmVyYXRpdmUgbWFya2Vycy4gCmNlbGxfc3RhdGVfbWFya2VycyA8LSBjKCJNa2k2NyIsIlBjbmEiKQoKIyBhY3Rpbl9tYXJrZXJzIGNvbnRhaW5zIGFsbCBnZW5lcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjdGluIGN5dG9za2VsZXRvbi4gCmFjdGluX21hcmtlcnMgPC0gYygiQXJoZ2RpYSIsIkNhbXNhcDIiLCAiQW54YTEiLCAiUmZsbmIiLCAiVG1zYjR4IiwgIkFycGMxYiIsICJTYnNuIiwiRHNnMyIsICJBaG5hayIsICJDZGgxIiwgIkNvbDNhMSIsICJUcHQxIiwgIkxnYWxzNyIsICJSYWNrMSIsICJTMTAwYTExIiwgIkVlZjFiMiIsICJSYW4iLCAiU3BycjFhIiwgIktsZjgiLCAiUHRwcmYiKQoKIyBwbG1uX21hcmtlcnMgaGFzIHB1dGF0aXZlIGxhbWluIGJvZGllcyBtYXJrZXJzIGludmVzdGlnYXRlZC4gCnBsbW5fbWFya2VycyA8LSBjKCJJcG83IiwgIlJhbiIsICJTbnVwbiIsICJNYXRyMyIsICJOdXAxNTMiKQoKIyBTR1BCX21hcmtlcnMgY29udGFpbnMgZ2VuZXMgYXNzb2NpYXRlZCB3aXRoIGNvbmRlbnNhdGVzLCBwcmltYXJseSBzdHJlc3MgZ3JhbnVsZXMgYW5kIFAgYm9kaWVzLgpTR1BCX21hcmtlcnMgPC0gYygiRGR4NiIsICJFaWY0ZSIsICJOeGYxIiwgIkxzbTE0YSIsICJDYXByaW4xIiwgIkNzZGUxIiwgIlB1bTEiLCAiWmZwMzYiKQoKIyBvdGhlcl9tYXJrZXJzIGNvbnRhaW5zIG1pc2NlbGxhbmVvdXMgbWFya2Vycywgbm90ZXMgYmVsb3cgdmFyaWFibGUgc2hvdyByZWFzb25pbmcuIApvdGhlcl9tYXJrZXJzIDwtIGMoIlNuaGcxMSIsICJGYWJwNSIsICJTbGMyNWE0IiwgIkxnYWxzNyIsICJUYWNzdGQyIiwgIkZvc2IiLCAiQ2Q0NCIsICJUcnB2NCIsICJUcnBtNCIgKQoKI1RyIGdlbmVzIGFyZSBjYWxjaXVtIGNoYW5uZWxzIGZvdW5kIHNwZWNpZmljYWxseSBpbiBVR0wgTWF0c3VpIDIwMjEKI2tlcmF0byBtYXJrZXQgZ2VuZXMgbm90IGZvdW5kCiMoIktsazUiKSkoIktsazIiKSkoIktsazMiKSkoIktsazQiKSkoIktsazkiKSkKIyAoIkNybm4iKSkgQ29ybnVsaW4gICgiU3BycjJhIikpIG5vdCBmb3VuZCAoIlNwcnIyYiIpKSAoIlNwcnIyYyIpKQojICgiU3BycjJkIikpICgiU3BycjJlIikpICgiU3BycjJmIikpICgiU3BycjJnIikpICgiU3BycjMiKSkgKCJTcHJyNCIpKQojICgiQUFCUjA3MDEyMzI5LjEiKSkgKCJMb3IiKSkgKCJGbGciKSkgKCJSZ3BkMSIpKSAoIlN5bmU0IikpIERjcDIsIAoKI2RzZzEsIGRzcCAtIHNwaW5vdXMsIAojIHNwaW5rNSwgZ3JhbnVsYXIKCiNEc3AsIFBwbCwgRXZwbAoKI2NvbWJpbmVzIGFsbCBhYm92ZSBsaXN0cyBpbnRvIG9uZSBzdXBlcmxpc3QgJ2xpc3Rfb2ZfZmVhdHVyZXMnLCB3aGljaCBpcyB0aGVuIHBhcnNlZCB0byBsYXRlciBpbWFnZSBmdW5jdGlvbnMuIApsaXN0X29mX2ZlYXR1cmVzIDwtIGMoa2VyYXRvX21hcmtlcl9nZW5lcywgY2VsbF9zdGF0ZV9tYXJrZXJzLCBhY3Rpbl9tYXJrZXJzLCBwbG1uX21hcmtlcnMsIFNHUEJfbWFya2Vycywgb3RoZXJfbWFya2VycykKYGBgCgoKYGBge3J9CiMgd2lsbCBtYWtlIHZhcmlhYmxlICd0aWR5a2VyYXRvJywgYSBmb3JtIG9mIG9iamVjdCB0aGF0IGNhbiBiZSBlYXNpbHkgcGFyc2VkIHRvIGRhdGEgYW5hbHlzaXMsIHNpbWlsYXIgdG8gdGliYmxlLiAKIyB0aWR5a2VyYXRvIDwtIHRpZHlzZXVyYXQ6OmtlcmF0bwpgYGAKCmBgYHtyfQojIHVzaW5nIHBpcGVzIHRvIHB1c2gga2VyYXRvIFFDIGRhdGEgaW50byBib3hwbG90cy4gVGhlIHRocmVlIG1ham9yIFFDIGNvdmFyaWF0ZXMgYXJlIHBsb3R0ZWQgYWdhaW5zdCBmcmVxdWVuY3kgb3ZlciB0aGUgY2x1c3RlcnMuIAoKIyBOdW1iZXIgb2YgY291bnRzIG9mIFJOQSBwZXIgYmFyY29kZS4gCmtlcmF0byAlPiUKICB0aWR5c2V1cmF0OjpnZ3Bsb3QoYWVzKHNldXJhdF9jbHVzdGVycywgbkNvdW50X1JOQSwgZmlsbCA9IHNldXJhdF9jbHVzdGVycykpICsgIyB1c2luZyBnZ3Bsb3QyIGFlc3RoZXRpY3MgdG8gY2hhbmdlIGxhYmVscyBhbmQgYWRkIGppdHRlci4gCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKwogIGdlb21faml0dGVyKHdpZHRoID0gMC4xKSArCiAgeGxhYignQ2x1c3RlcicpICsKICB5bGFiKCdSTkEgUmVhZCBDb3VudCcpICsKICBsYWJzKGZpbGwgPSAiQ2x1c3RlciIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCiMgTnVtYmVyIG9mIGZlYXR1cmVzIHBlciBiYXJjb2RlLiAKa2VyYXRvICU+JQogIHRpZHlzZXVyYXQ6OmdncGxvdChhZXMoc2V1cmF0X2NsdXN0ZXJzLCBuRmVhdHVyZV9STkEsIGZpbGwgPSBzZXVyYXRfY2x1c3RlcnMpKSArCiAgZ2VvbV9ib3hwbG90KG91dGxpZXIuc2hhcGUgPSBOQSkgKyAjIHVzaW5nIGdncGxvdDIgYWVzdGhldGljcyB0byBjaGFuZ2UgbGFiZWxzIGFuZCBhZGQgaml0dGVyLiAKICBnZW9tX2ppdHRlcih3aWR0aCA9IDAuMSkgKwogIHhsYWIoJ0NsdXN0ZXInKSArCiAgeWxhYignUk5BIEZlYXR1cmUgQ291bnQnKSArCiAgbGFicyhmaWxsID0gIkNsdXN0ZXIiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCiAgCiMgUGVyY2VudGFnZSBtaXRvY2hvbmRyaWFsIFJOQSBjb250ZW50IHBlciBiYXJjb2RlLiAKa2VyYXRvICU+JQogIHRpZHlzZXVyYXQ6OmdncGxvdChhZXMoc2V1cmF0X2NsdXN0ZXJzLCBwZXJjZW50Lm10LCBmaWxsID0gc2V1cmF0X2NsdXN0ZXJzKSkgKwogIGdlb21fYm94cGxvdChvdXRsaWVyLnNoYXBlID0gTkEpICsgIyB1c2luZyBnZ3Bsb3QyIGFlc3RoZXRpY3MgdG8gY2hhbmdlIGxhYmVscyBhbmQgYWRkIGppdHRlci4gCiAgZ2VvbV9qaXR0ZXIod2lkdGggPSAwLjEpICsKICB4bGFiKCdDbHVzdGVyJykgKwogIHlsYWIoJ1BlcmNlbnRhZ2UgbWl0b2Nob25kcmlhbCBSTkEnKSArCiAgbGFicyhmaWxsID0gIkNsdXN0ZXIiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCiAgCiAgCmBgYAoKYGBge3J9CgoKClZsblBsb3Qoa2VyYXRvLCBmZWF0dXJlcyA9IGMoInBlcmNlbnQubXQiKSkgKyBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSJDbHVzdGVyIiwgbGltaXRzPWMoIjIiLCIzIiwiMSIsICIwIiksIGxhYmVscz1jKCJTbWFsbCIsICJNaWQtc3RhZ2UiLCJMYXRlLXN0YWdlIiwgIkRlYWQiKSkgKyBnZ3RpdGxlKCJQZXJjZW50YWdlIG1pdG9jaG9uZHJpYWwgUk5BIikgKyB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpCgpWbG5QbG90KGtlcmF0bywgZmVhdHVyZXMgPSBjKCJuRmVhdHVyZV9STkEiKSkgKyBzY2FsZV94X2Rpc2NyZXRlKG5hbWUgPSJDbHVzdGVyIiwgbGltaXRzPWMoIjIiLCIzIiwiMSIsICIwIiksIGxhYmVscz1jKCJTbWFsbCIsICJNaWQtc3RhZ2UiLCJMYXRlLXN0YWdlIiwgIkRlYWQiKSkgKyBnZ3RpdGxlKCJOdW1iZXIgb2YgZmVhdHVyZXMiKSArIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkKCgpWbG5QbG90KGtlcmF0bywgZmVhdHVyZXMgPSBjKCJuQ291bnRfUk5BIikpICsgc2NhbGVfeF9kaXNjcmV0ZShuYW1lID0iQ2x1c3RlciIsIGxpbWl0cz1jKCIyIiwiMyIsIjEiLCAiMCIpLCBsYWJlbHM9YygiU21hbGwiLCAiTWlkLXN0YWdlIiwiTGF0ZS1zdGFnZSIsICJEZWFkIikpICsgZ2d0aXRsZSgiTnVtYmVyIG9mIGNvdW50cyIpICsgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKQoKYGBgCgpgYGB7cn0KIyBDaHVuayBwcmludGluZyBRQyBtZXRyaWNzIHRvIGNvbnNvbGUsIGFsbG93cyBleHRyYWN0aW9uIGFuZCBhbmFseXNpcyBvZiBzdGF0aXN0aWNzLiAKCmNhdCgnY291bnRzJykKc3VtbWFyeShrZXJhdG8kbkNvdW50X1JOQSkKY2F0KCdtaXRvJykKc3VtbWFyeShrZXJhdG8kcGVyY2VudC5tdCkKY2F0KCdmZWF0dXJlcycpCnN1bW1hcnkoa2VyYXRvJG5GZWF0dXJlX1JOQSkKYGBgCgoKYGBge3J9CiMgUGFyc2UgbGlzdF9vZl9mZWF0dXJlcyB0byBGZWF0dXJlUGxvdCwgd2hpY2ggZ2l2ZXMgaGVhdG1hcHMgb2YgdGhlIGNsdXN0ZXJzIHNob3dpbmcgYSBmZWF0dXJlcyBleHByZXNzaW9uLiAKCmZvciAoZ2VuZSBpbiBsaXN0X29mX2ZlYXR1cmVzKXsKCiAgcCA8LSBGZWF0dXJlUGxvdChrZXJhdG8sIGZlYXR1cmVzID0gKGdlbmUpKQogIHByaW50KHApCn0KCiMgVXNlIHRoaXMgbGluZSB0byBzZWUgc2luZ2xlIGZlYXR1cmUgcGxvdCwgZm9yIGVhc2UuIApGZWF0dXJlUGxvdChrZXJhdG8sIGZlYXR1cmVzID0gIlNic24iKQpgYGAKYGBge3J9CiN0aGlzIHdpbGwgcHJpbnQgYWxsIGdlbmVzIHdpdGhpbiBhIGNoYXJhY3RlciB2ZWN0b3IncyBjbHVzdGVyIGdyYXBocwoKIyBmb3IgKGdlbmUgaW4gYWN0aW5fbWFya2Vycyl7CiMgCiMgICBwIDwtIEZlYXR1cmVQbG90KGtlcmF0bywgZmVhdHVyZXMgPSAoZ2VuZSkpCiMgICBwcmludChwKQojIH0KYGBgCgoKYGBge3J9CiMgUGFyc2UgUUMgbWV0cmljcyB0byBGZWF0dXJlUGxvdCwgd2hpY2ggZ2l2ZXMgaGVhdG1hcHMgb2YgdGhlIGNsdXN0ZXJzIHNob3dpbmcgYSBmZWF0dXJlcyBleHByZXNzaW9uLiAKCkZlYXR1cmVQbG90KGtlcmF0bywgZmVhdHVyZXMgPSAicGVyY2VudC5tdCIsIGxhYmVsID0gVFJVRSkKRmVhdHVyZVBsb3Qoa2VyYXRvLCBmZWF0dXJlcyA9ICJwZXJjZW50Lm10IikKCkZlYXR1cmVQbG90KGtlcmF0bywgZmVhdHVyZXMgPSAibkZlYXR1cmVfUk5BIiwgbGFiZWwgPSBUUlVFKQpGZWF0dXJlUGxvdChrZXJhdG8sIGZlYXR1cmVzID0gIm5GZWF0dXJlX1JOQSIpCgpGZWF0dXJlUGxvdChrZXJhdG8sIGZlYXR1cmVzID0gIm5Db3VudF9STkEiLCBsYWJlbCA9IFRSVUUpCkZlYXR1cmVQbG90KGtlcmF0bywgZmVhdHVyZXMgPSAibkNvdW50X1JOQSIpCgojY2x1c3RlciBncmFwaCBzaG93aW5nIGxhYmVsZWQgY2x1c3RlcnMKRGltUGxvdChrZXJhdG8sIHJlZHVjdGlvbiA9ICJ1bWFwIiwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMC41KSAKYGBgCgoKYGBge3J9CiMgQ3JlYXRlIGxpc3Qgb2YgbWFya2VyIGdlbmVzIGZvciB0aGUgY2x1c3RlcnMgdXNpbmcgZmlsdGVycy4gbWluLnBjdCBpcyB0aGUgbWluaW11bSBwZXJjZW50YWdlIHByZXNlbnQuIG9ubHkucG9zIHNlbGVjdHMgb25seSBwb3NpdGl2ZSBtYXJrZXJzIGZvciB0aGlzLgoKbWFya2Vyc19zdHJlYW1saW5lZCA8LQogIGtlcmF0byAlPiUKICBGaW5kQWxsTWFya2Vycyhvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCB0aHJlc2gudXNlID0gMC4yNSkgJT4lCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lIAogIHRvcF9uKDEwLCBhdmdfbG9nMkZDKSAjIG9ubHkgdGFrZSB0b3AgdGVuIGdlbmVzLgoKIyBQbG90IGhlYXRtYXAKa2VyYXRvICU+JQogIERvSGVhdG1hcCgKICAgIGZlYXR1cmVzID0gbWFya2Vyc19zdHJlYW1saW5lZCRnZW5lCiAgICAKICApCgojIGNoYW5naW5nIHRleHQgc2l6ZSB3aXRoICsgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDAuMSkpIGRvZXNuJ3Qgc2VlbSB0byB3b3JrLCBuZWVkcyBzb21lIGdyYXBoaWNhbCBhZGp1c3RtZW50cy4gCmBgYAoKCmBgYHtyfQojIFBhcnNlIFFDIG1ldHJpY3MgdG8gc2NhdHRlciBwbG90cyB1c2luZyBnZW9tX3BvaW50IChnZ3Bsb3QyKSwgYWRkaW5nIHNtb290aGVuZWQgbGluZSBvZiBiZXN0IGZpdCB3aXRoIHN0YXRfc21vb3RoLCBhbmQgcGVhcnNvbiBjb3JyZWxhdGlvbiBjb2VmZmljaWVudCB3aXRoIGdlb21fY29yLiAKCmtlcmF0byAlPiUKICB0aWR5c2V1cmF0OjpnZ3Bsb3QoYWVzKHg9UHNldWRvdGltZSwgeT1uQ291bnRfUk5BKSkgKyAKICBnZW9tX3BvaW50KCkgKyAKICBzdGF0X3Ntb290aChtZXRob2Q9ImxtIiwgc2U9VFJVRSwgY29sb3VyID0gJ2JsYWNrJywgcGxvdC5jb3IgPSBUUlVFKSArIAogIGdlb21fY29yKG1ldGhvZCA9ICJwZWFyc29uIikKCmtlcmF0byAlPiUKICB0aWR5c2V1cmF0OjpnZ3Bsb3QoYWVzKHg9UHNldWRvdGltZSwgeT1wZXJjZW50Lm10KSkgKyAgIGdlb21fcG9pbnQoKSArIAogIHN0YXRfc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1UUlVFLCBjb2xvdXIgPSAnYmxhY2snLCBwbG90LmNvciA9IFRSVUUpICsgCiAgZ2VvbV9jb3IobWV0aG9kID0gInBlYXJzb24iKQoKa2VyYXRvICU+JQogIHRpZHlzZXVyYXQ6OmdncGxvdChhZXMoeD1Qc2V1ZG90aW1lLCB5PW5GZWF0dXJlX1JOQSkpICsgCiAgZ2VvbV9wb2ludCgpICsgCiAgc3RhdF9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPVRSVUUsIGNvbG91ciA9ICdibGFjaycsIHBsb3QuY29yID0gVFJVRSkgKyAKICBnZW9tX2NvcihtZXRob2QgPSAicGVhcnNvbiIpCgoKYGBgCgoKYGBge3J9CiMgVGhpcyBjaHVuayBwYXJzZXMgYWxsIGZlYXR1cmUgZ2VuZXMgdG8gRmVhdHVyZVNjYXR0ZXIsIGFuZCBhZGRzIGEgbGluZSBvZiBiZXN0IGZpdCB3aXRoIHN0YW5kYXJkIGVycm9yIHJlZ2lvbiBwcmVzZW50LiAKCiMgZm9yIChnZW5lIGluIGxpc3Rfb2ZfZmVhdHVyZXMpewojICAgI3plcm9fc2NydWIgPC0gc3Vic2V0KHggPSBrZXJhdG8sIHN1YnNldCA9ICAoYXMuZmFjdG9yKCdLcnQxMCcpID4gMCkpCiMgICAjIHNvbHV0aW9uIG1heSBiZSBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vc2F0aWphbGFiL3NldXJhdC9pc3N1ZXMvMjYxOQojICAgCiMgICBwIDwtIEZlYXR1cmVTY2F0dGVyKGtlcmF0bywgZmVhdHVyZTEgPSAiUHNldWRvdGltZSIsIGZlYXR1cmUyID0gKGdlbmUpKQojICAgCiMgICBwcmludChwICsKIyAgICAgICAgICAgCiMgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMS4yLCB2anVzdCA9IC0yKSkgKyAjIGFkanVzdCBwZWFyc29ucyBjb2VmZmljaWVudCB0byByaWdodCBoYW5kIHNpZGUKIyAgIHN0YXRfc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1UUlVFLCBjb2xvdXIgPSAnYmxhY2snKSArICMgcmVncmVzc2lvbiBsaW5lCiMgICAgIAojICAgI2xhYmVscwojICAgeGxhYignUHNldWRvdGltZScpICsgCiMgICB5bGFiKHNwcmludGYoJyVzIExvZzIgRXhwcmVzc2lvbicsIGdlbmUpKSArCiMgICBsYWJzKGZpbGwgPSAiQ2x1c3RlciIpKSAKIyB9CmBgYAoKYGBge3J9CgogICN6ZXJvX3NjcnViIDwtIHN1YnNldCh4ID0ga2VyYXRvLCBzdWJzZXQgPSAgKGFzLmZhY3RvcignS3J0MTAnKSA+IDApKQogICMgc29sdXRpb24gbWF5IGJlIGhlcmU6IGh0dHBzOi8vZ2l0aHViLmNvbS9zYXRpamFsYWIvc2V1cmF0L2lzc3Vlcy8yNjE5CiMgb2JqX3N1YnNldCA8LSBrZXJhdG9bLCBHZXRBc3NheURhdGEoa2VyYXRvW1thc3NheV1dKVtnZW5lLCBdID4gMV0KI2FjdGluX21hcmtlcnMgPC0gYygiQXJoZ2RpYSIsIkNhbXNhcDIiLCAiQW54YTEiLCAiUmZsbmIiLCAiVG1zYjR4IiwgIkFycGMxYiIsICJTYnNuIiwiRHNnMyIsICJBaG5hayIsICJDZGgxIiwgIkNvbDNhMSIsICJUcHQxIiwgIkxnYWxzNyIsICJSYWNrMSIsICJTMTAwYTExIiwgIkVlZjFiMiIsICJSYW4iLCAiU3BycjFhIiwgIktsZjgiLCAiUHRwcmYiKSBDZmwxLCBJcG85LCBYcG82LCBUZ20xCgojICAgICAgICAgICAgICAgICAgICAgc2V0IGdlbmUgZm9yIGxpbmUgcGxvdHwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAoKI2V4cGVyaW1lbnQgcmVtb3ZpbmcgemVybyB2YWx1ZXMgZnJvbSBwbG90CiMgb2JqX3N1YnNldCA8LSBzdWJzZXQoeCA9IGtlcmF0bywgc3Vic2V0ID0gWHBvNiA+IDApCiMgCiMgCiMgcCA8LSBGZWF0dXJlU2NhdHRlcihvYmpfc3Vic2V0LCBmZWF0dXJlMSA9ICJQc2V1ZG90aW1lIiwgZmVhdHVyZTIgPSAoZ2VuZSkpCiMgICAKIyBwcmludChwICsKIyAgICAgICAgICAgCiMgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDEuMiwgdmp1c3QgPSAtMikpICsgIyBhZGp1c3QgcGVhcnNvbnMgY29lZmZpY2llbnQgdG8gcmlnaHQgaGFuZCBzaWRlCiMgc3RhdF9zbW9vdGgobWV0aG9kPSJsbSIsIHNlPVRSVUUsIGNvbG91ciA9ICdibGFjaycpICsgIyByZWdyZXNzaW9uIGxpbmUKIyAgICAgCiMgICAjbGFiZWxzCiMgeGxhYignUHNldWRvdGltZScpICsgCiMgeWxhYihzcHJpbnRmKCclcyBMb2cyIEV4cHJlc3Npb24nLCBnZW5lKSkgKwojIGxhYnMoZmlsbCA9ICJDbHVzdGVyIikpIAoKYGBgCgpgYGB7cn0KI2NodW5rIHBsb3R0aW5nIGFsbCBwc2V1ZG90aW1lIGxpbmUgZ3JhcGhzIGZvciBnZW5lcyBpbiBhIGNoYXJhY3RlciB2ZWN0b3IKCiMgZm9yIChnZW5lIGluIGFjdGluX21hcmtlcnMpewojICAgCiMgICBwIDwtIEZlYXR1cmVTY2F0dGVyKGtlcmF0bywgZmVhdHVyZTEgPSAiUHNldWRvdGltZSIsIGZlYXR1cmUyID0gKGdlbmUpKQojICAgCiMgICBwcmludChwICsKIyAgICAgICAgICAgCiMgICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMS4yLCB2anVzdCA9IC0yKSkgKyAjIGFkanVzdCBwZWFyc29ucyBjb2VmZmljaWVudCB0byByaWdodCBoYW5kIHNpZGUKIyAgIHN0YXRfc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1UUlVFLCBjb2xvdXIgPSAnYmxhY2snKSArICMgcmVncmVzc2lvbiBsaW5lCiMgICAgIAojICAgI2xhYmVscwojICAgeGxhYignUHNldWRvdGltZScpICsgCiMgICB5bGFiKHNwcmludGYoJyVzIExvZzIgRXhwcmVzc2lvbicsIGdlbmUpKSArCiMgICBsYWJzKGZpbGwgPSAiQ2x1c3RlciIpKSAKIyB9CmBgYAoKCmBgYHtyfQojIFNpbWlsYXIgdG8gY2h1bmsgYWJvdmUsIGludmVzdGlnYXRpbmcgc2luZ2xlIGdlbmVzIGZvciBlYXNlIG9mIHVzZS4gCgpwc2V1ZG90aW1lX3NjYXR0ZXJfZ2VuZSA8LSAnQ3RzYScKIyJEZHg2IiwgIkVpZjRlIgoKI2IsIGwsIGQsIHMsIGgsIGMsIGssIGUsIGcsIHosIGosIGYsIHIsIG0sIDcsIGEsIHEKCkZlYXR1cmVTY2F0dGVyKGtlcmF0bywgZmVhdHVyZTEgPSAiUHNldWRvdGltZSIsIGZlYXR1cmUyID0gKHBzZXVkb3RpbWVfc2NhdHRlcl9nZW5lKSkgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAxLjIsIHZqdXN0ID0gLTIpKSArICMgYWRqdXN0IHBlYXJzb25zIGNvZWZmaWNpZW50IHRvIHJpZ2h0IGhhbmQgc2lkZQogIHN0YXRfc21vb3RoKG1ldGhvZD0ibG0iLCBzZT1UUlVFLCBjb2xvdXIgPSAnYmxhY2snKSArICMgcmVncmVzc2lvbiBsaW5lCiAgICAKICAjbGFiZWxzCiAgeGxhYignUHNldWRvdGltZScpICsgCiAgeWxhYihzcHJpbnRmKCclcyBMb2cyIEV4cHJlc3Npb24nLCBwc2V1ZG90aW1lX3NjYXR0ZXJfZ2VuZSkpICsKICBsYWJzKGZpbGwgPSAiQ2x1c3RlciIpIAoKRmVhdHVyZVBsb3Qoa2VyYXRvLCBmZWF0dXJlcyA9IChwc2V1ZG90aW1lX3NjYXR0ZXJfZ2VuZSkpCgpgYGAKCgoK